package org.xlp.db.xml;

import org.xlp.assertion.AssertUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * {@link SQLXmlFileHandlerChain} 对象创建工厂
 * @version 1.0
 * @author xlp
 */
public class SQLXmlFileHandlerChainFactory implements ISQLXmlFileHandlerList, ISQLXmlFileHandlerChainFactory {
    /**
     * 存储sql文件处理器
     */
    private List<ISQLXmlFileHandler> sqlXmlFileHandlers = new ArrayList<>();

    /**
     * 添加处理器
     * @param index 向指定索引添加处理器
     * @param handler 要添加的处理器
     * @throws NullPointerException 假如参数 handler 为null，则抛出该异常
     */
    @Override
    public void addHandler(int index, ISQLXmlFileHandler handler){
        AssertUtils.isNotNull(handler, "handler parameter must not be null!");
        if (index < 0){
            index = 0;
        } else if (index >= sqlXmlFileHandlers.size()){
            index = sqlXmlFileHandlers.size() - 1;
        }
        sqlXmlFileHandlers.add(index, handler);
    }

    /**
     * 添加处理器
     * @param handler 要添加的处理器
     * @throws NullPointerException 假如参数 handler 为null，则抛出该异常
     */
    @Override
    public void addHandler(ISQLXmlFileHandler handler){
        AssertUtils.isNotNull(handler, "handler parameter must not be null!");
        sqlXmlFileHandlers.add(handler);
    }

    /**
     * 向头部添加处理器
     *
     * @param handler 要添加的处理器
     * @throws NullPointerException 假如参数 handler 为null，则抛出该异常
     */
    @Override
    public void addHandlerToHead(ISQLXmlFileHandler handler) {
        addHandler(0, handler);
    }

    /**
     * 移除指定位置的处理器
     * @param index
     * @throws IllegalAccessException 假如参数不合理，则抛出该异常
     */
    @Override
    public void removeHandler(int index){
        if (index < 0 || index >= sqlXmlFileHandlers.size()){
            throw new IllegalArgumentException("index parameter is Illegal!");
        }
        sqlXmlFileHandlers.remove(index);
    }

    /**
     * 移除指定的sql处理器
     *
     * @param handler
     * @throws NullPointerException 假如参数 handler 为null，则抛出该异常
     */
    @Override
    public void removeHandler(ISQLXmlFileHandler handler) {
        AssertUtils.isNotNull(handler, "handler parameter must not be null!");
        sqlXmlFileHandlers.remove(handler);
    }

    /**
     * 移除所有的处理器
     */
    @Override
    public void clearHandler(){
       sqlXmlFileHandlers.clear();
    }

    /**
     * 获取所有的sql处理器
     *
     * @return
     */
    @Override
    public List<ISQLXmlFileHandler> getAllHandlers() {
        return Collections.unmodifiableList(sqlXmlFileHandlers);
    }

    /**
     * 创建{@link ISQLXmlFileHandlerChain} 对象
     * @return
     */
    @Override
    public ISQLXmlFileHandlerChain createSQLXmlFileHandlerChain(){
        SQLXmlFileHandlerChain chain = new SQLXmlFileHandlerChain();
        sqlXmlFileHandlers.forEach(chain::addHandler);
        return chain;
    }
}
